Replication data

From code/replication.R, which starts with the main data file (dcounts_min.Rdata) and makes transformations for three sets of models:

  1. counts per member-year (dcounts_tenure.Rdata/AgencyComm.dta)
  2. ratio per member-year (dcounts_ratio.Rdata/ProportionContact.dta)
  3. counts per district-year (dcounts_per_district.Rdata, DistrictLevel.dta)

The same three datasets are used in Replication.do

load(here::here("data", "dcounts_tenure.Rdata"))
load(here::here("data", "dcounts_ratio.Rdata"))
load(here::here("data", "dcounts_per_district.Rdata"))
load(here::here("data" , "members.Rdata"))


# var names for tables
dcounts_tenure %<>% 
  mutate(Legislator = icpsr,
         Legislator_x_Agency = icpsr_agency,
         Year_x_Agency = agency_year)

# total per agency
dcounts_tenure %>% group_by(agency) %>% summarise(n = perYear %>% sum()) %>% arrange(-n) %>% kablebox()
agency n
VA 76868
DHHS_CMS 67613
HUD_HQ 33838
DOL_SOL 27065
DHS_HQ 26294
USPS 17084
FTC 13417
DOT_FAA 12235
Treasury_IRS 11591
Treasury_Fiscal 11233
EPA 10956
DHHS_HRSA 10810
DOL_OWCP 10710
DOL_EBSA 10018
DHHS_FDA 9719
NARA 9690
DOT_FHWA 9224
DHHS_NIH 7226
EOP_USTR 7188
DHHS_CDC 6390
FCC 5838
USDA 5058
DOC_SBA 4679
DOD_Navy 4606
ED 4573
SSA 4439
DOI_NPS 4248
NASA 2925
FHFA 2879
DOE_FERC 2572
DOT_FRA 2545
USDA_RD 2486
RRB 2377
DOT_FTA 2186
DOD_OSDJS 1905
DOL_OSHA 1893
DOD_OIG 1575
DOC_OS 1536
Amtrak 1500
DOI_BOEM 1398
DOJ_CIV 1288
Treasury_OCC 1285
DHHS_IHS 1223
DOL_VETS 992
DOL_MSHA 959
DOC_EDA 956
CNCS 854
USDA_FS 718
DOD_DFAS 705
DOJ_EOIR 693
DHHS_ACF 691
USDA_RMA 668
DHS_ICE 656
NLRB 634
DOJ_ENRD 613
USDA_NRCS 569
EEOC 566
DOD_DeCA 552
DOT_PHMSA 478
DOL_OFCCP 462
DOL_OASAM 397
PRC 390
NCUA 356
DOC_IOS 347
DOD_USACE 346
DOC_NIST 274
EOP_CEQ 240
DOD_DLA_Aviation 226
DOI_USGS 200
USDA_NIFA 127
DOC_NTIA 119
DHHS_ACL 114
DOI_BSEE 89
TVA 83
USDA_NASS 81
ABMC 78
DOI_SOL 77
FCA 69
DOC_NOAA 56
DOC_OCPA 53
DOI_OSMRE 48
USDA_ERS 44
CSOSA 32
VA_CEM 20
DOT_SLSDC 17
DOL_OCFO 16
NCPC 12
NWTRB 10
DOC_MBDA 9
DOI_NIGC 6
# total per legislator-agency pair 
dcounts_tenure %>% group_by(Legislator_x_Agency) %>% summarise(n = perYear %>% sum()) %>% arrange(-n) %>% kablebox()
Legislator_x_Agency n
VA_15039 2159
VA_94659 1662
DHHS_CMS_40909 1572
VA_14858 1407
VA_29718 1233
VA_20530 1128
VA_29935 1087
VA_14440 1070
DHS_HQ_14858 1058
VA_40915 1054
VA_29512 1029
VA_14869 949
VA_15021 934
VA_29566 855
DHHS_CMS_20336 853
DHHS_CMS_14226 769
DHHS_CMS_14921 717
VA_15408 698
HUD_HQ_14651 693
VA_40305 687
DHHS_CMS_14506 684
NARA_41308 649
VA_20330 646
DHHS_CMS_14503 632
DHHS_CMS_14440 618
VA_14226 597
VA_1366 575
VA_40706 556
DHHS_CMS_29548 552
HUD_HQ_49300 542
VA_21328 541
HUD_HQ_29909 539
DHHS_CMS_41102 536
DHS_HQ_15000 532
DHHS_CMS_94659 529
DHS_HQ_40706 526
HUD_HQ_20735 525
VA_39305 522
NARA_21111 515
VA_29771 512
DHHS_CMS_39308 480
DHHS_CMS_20143 471
DHHS_CMS_21103 470
DHS_HQ_14824 469
DHHS_CMS_49703 468
DHS_HQ_14651 468
DHHS_CMS_29389 465
VA_20735 463
DHHS_CMS_14871 462
DHHS_CMS_20530 457
DHHS_CMS_49700 456
DHHS_CMS_40304 454
VA_21555 454
DHHS_CMS_15124 451
DOL_SOL_40909 451
VA_39308 447
VA_41502 447
DHHS_CMS_14651 438
DHHS_CMS_14869 438
DHHS_CMS_20115 427
VA_29754 421
DHHS_CMS_40706 420
HUD_HQ_14824 419
DHHS_CMS_14858 417
VA_20115 416
DHHS_CMS_15446 415
DHHS_CMS_21358 415
VA_29909 411
DHHS_CMS_40703 407
DHHS_CMS_20144 404
DHHS_CMS_21191 401
VA_40700 397
DHS_HQ_29368 385
DHHS_CMS_21123 381
USPS_14226 376
VA_21513 376
VA_40906 375
DHHS_CMS_29142 373
VA_14709 373
HUD_HQ_15011 371
DHHS_CMS_40915 370
DHS_HQ_20530 370
DHHS_CMS_15054 367
DHS_HQ_14226 367
HUD_HQ_14858 359
DOL_EBSA_14651 358
DHHS_CMS_20346 352
VA_29368 351
DOL_SOL_14651 350
FTC_14651 349
VA_20343 348
DHHS_CMS_15039 346
VA_14873 346
VA_20713 345
DHS_HQ_40305 338
DHHS_CMS_90327 334
DHHS_CMS_15703 331
VA_15424 326
DOL_SOL_40706 325
DHHS_CMS_20947 323

Values to predict at

The most frequent legislator agency pair: McCain x VA with 2159 letters!

The average is 73 letters per legislator per year, a little over 1.29 letters per agency per year.

For predictions, we need an average member-year-agency triad. The first table below shows the members who averaged 73, entered Congress between 2007 and 2011, were observed in our data for at least seven years, and most often submitted exactly one letter to an agency (the closest integer 1.29). For realism, this person would ideally, at some point in our data, become a chair. Of the modal legislators, Phil Roe meets this last criterion. The IRS is a fairly modal agency and one of the agencies to which Phil Roe submitted one letter in 2015, so predictions are at Phil Roe X IRS X 2015. Other legislators, years, and agencies are simply intercept shifts.

modal <- dcounts_tenure %>% 
  group_by(icpsr) %>% 
  filter(first_year > 2006, first_year < 2013, max_year > 6) %>% 
  mutate(Chair = sum(chair, na.rm = T) >1) %>% 
  group_by(icpsr, year) %>%
  mutate(perLeg = sum(perYear)) %>% 
  filter(perYear == 1, perLeg == 73 ) %>% 
  select(perAgency = perYear, perLeg, icpsr, icpsr_agency, agency_year, first_year, max_year, Chair) %>% 
  distinct() %>% 
  ungroup() %>% left_join(members %>% select(bioname, icpsr))

modal %>%
  mutate(average = perLeg) %>% 
  count(average, bioname, first_year, max_year, Chair, sort = T, name = "agency_year_count == 1") %>% 
  kablebox()
average bioname first_year max_year Chair agency_year_count == 1
73 COONS, Christopher A. 2009 9 FALSE 78
73 MERKLEY, Jeff 2009 9 FALSE 66
73 ROE, David P. (Phil) 2009 9 TRUE 66
73 HELLER, Dean 2007 11 FALSE 63
73 TITUS, Alice (Dina) 2009 9 FALSE 60
73 BRALEY, Bruce 2007 7 FALSE 52
73 PETERS, Gary C. 2009 9 FALSE 42
73 FARENTHOLD, Blake 2011 7 FALSE 36
73 SHEA-PORTER, Carol 2007 11 FALSE 16
modal %<>% filter(Chair)

dcounts_tenure %>% 
  group_by(icpsr, year) %>% 
  mutate (perLegislator = sum(perYear)) %>% 
  ungroup() %>% 
  mutate(meanLeg = mean(perLegislator),
         meanYear = mean(perYear)) %>%
  filter( abs(perLegislator - meanLeg) < 10,   
          abs(perYear - meanYear) < 10 )  %>%
  ggplot() +
  aes(x = perYear, y = perLegislator) + 
    geom_jitter() + 
  geom_vline(aes(xintercept = meanYear), color = "blue") + 
  geom_hline(aes(yintercept = meanLeg), color = "blue") + 
  geom_text_repel(aes(label = ifelse(icpsr_agency %in% modal$icpsr_agency & agency_year %in% modal$agency_year & perLegislator == 73, icpsr_agency, NA) ),
                  color = "red", box.padding = 0.5, max.overlaps = Inf) + 
  labs(x = "Contacts per Legislator per Agency per Year",
       y = "Contacts per Legislator per Year")

modal %>%
  distinct(perAgency, bioname, icpsr_agency, agency_year) %>% 
  kablebox()
perAgency icpsr_agency agency_year bioname
1 DHHS_CDC_20947 DHHS_CDC_2015 ROE, David P. (Phil)
1 DHHS_HRSA_20947 DHHS_HRSA_2015 ROE, David P. (Phil)
1 DHHS_NIH_20947 DHHS_NIH_2015 ROE, David P. (Phil)
1 DOD_USACE_20947 DOD_USACE_2015 ROE, David P. (Phil)
1 DOI_NPS_20947 DOI_NPS_2015 ROE, David P. (Phil)
1 DOL_OSHA_20947 DOL_OSHA_2015 ROE, David P. (Phil)
1 DOT_FRA_20947 DOT_FRA_2015 ROE, David P. (Phil)
1 NARA_20947 NARA_2015 ROE, David P. (Phil)
1 Treasury_Fiscal_20947 Treasury_Fiscal_2015 ROE, David P. (Phil)
1 Treasury_IRS_20947 Treasury_IRS_2015 ROE, David P. (Phil)
1 USDA_RMA_20947 USDA_RMA_2015 ROE, David P. (Phil)
## other variable means
# dcounts_tenure %>% summarise(across(everything(), mean_or_mode)) %>% kablebox()

# by chair and presidents' party
values <- tidyr::expand(dcounts_tenure,
                        agency = "Treasury_IRS",
                        chair = chair, 
                        ranking_minority    = FALSE, 
                        prestige = TRUE, 
                        first = FALSE,
                        second = FALSE,
                        third = FALSE,
                        fourth = FALSE,
                        fifth = FALSE, 
                        sixth = FALSE,
                        Legislator_x_Agency = "Treasury_IRS_20947",
                        Year_x_Agency = "Treasury_IRS_2015",
                        Legislator = "20947",
                        Year = "2015",
                        majority = TRUE,
                        presidents_party = presidents_party
                   ) %>% 
  drop_na(majority, chair)

# by year 
values_tenure <- tidyr::expand(dcounts_tenure,
                        agency = "Treasury_IRS",
                        chair = chair, 
                        ranking_minority    = FALSE, 
                        prestige = TRUE, 
                        first = first,
                        second = second,
                        third = third,
                        fourth = fourth,
                        fifth = fifth, 
                        sixth = sixth,
                        Legislator_x_Agency = "Treasury_IRS_20947",
                        Year_x_Agency = "Treasury_IRS_2015",
                        Legislator = "20947",
                        Year = "2015",
                        majority = TRUE,
                        presidents_party = TRUE
                   ) %>% 
  drop_na(chair)
# helper functions to plot predicted values
ggchair <- function(predicted = predicted) {
  
  predicted$chair %<>% str_replace("0", "Not Chair") %>% str_replace("1", "Chair")
  
  predicted$presidents_party %<>% str_replace("0", "Not President's Party") %>% str_replace("1", "President's Party")

predicted %>%  
  ggplot() + 
  aes(x = "", 
      y = predicted, 
      fill = chair,
      shape = chair,
      color = chair,
      ymin = predicted - 1.96*std.error,
      ymax = predicted + 1.96*std.error) + 
  geom_pointrange(position =  position_dodge(width = -.5)  )  + 
  scale_fill_viridis_d(begin = 0, end = .6, option = "cividis") +
  scale_color_viridis_d(begin = 0, end = .6, option = "cividis") +
      theme_minimal() + 
  theme(panel.border  = element_blank(),
        panel.grid.major.x = element_blank()) + facet_grid(. ~ presidents_party) 
}


ggtenure <- function(predicted = predicted) {
  
predicted %<>%
  # drop estimates from impossible values
      group_by(rowid, predicted, std.error, chair) %>% 
  mutate(sum = sum(first, second, third, fourth, fifth, sixth),
         more = ifelse(sum == 0, 1,0)) %>% 
    filter(sum < 2) %>% 
    pivot_longer(cols = c("first", "second", "third", "fourth", "fifth", "sixth", "more")) %>% 
    select(name, value) %>% 
    filter(value == 1) %>% 
    # clean up for presentation
    mutate(year_in_congress = name %>% 
             str_replace("more", "7\nor more") %>% 
             str_replace("sixth", "6") %>% 
             str_replace("fifth", "5") %>% 
             str_replace("fourth", "4") %>% 
             str_replace("third", "3") %>% 
             str_replace("second", "2") %>% 
             str_replace("first", "1") 
             ) %>% 
    ungroup()
  
# Ideally, we could plot against data, but there is so much variation that you can no longer distinguish differences in predicted values 
# predicted %<>% full_join(dcounts_tenure2 %>% mutate(predicted = NA))
  
predicted %<>% filter(chair == 0 | name %in% c("sixth", "more"))

  predicted$chair %<>% str_replace("0", "Not Chair") %>% str_replace("1", "Chair")
  

predicted %>%  
  ungroup() %>% 
  ggplot() + 
  aes(x = year_in_congress, 
      y = predicted, 
      shape = chair,
      color = chair,
      ymin = predicted - 1.96*std.error,
      ymax = predicted + 1.96*std.error) + 
  geom_pointrange(position =  position_dodge(width = -.3)  )  + 
  scale_fill_viridis_d(begin = 0, end = .6, option = "cividis") +
  scale_color_viridis_d(begin = 0, end = .6, option = "cividis") +
      theme_minimal() + 
  theme(panel.border  = element_blank(),
        panel.grid.major.x = element_blank()) 
  
}

Counts per member per year

Clustering standard errors at the legislator level:

“Clustering on the panel variable produces an estimator of the VCE that is robust to cross-sectional heteroskedasticity and within-panel (serial) correlation that is asymptotically equivalent to that proposed by Arellano (1987)”

Replicated using fixest::feglm here and xtreg in Replication.do. See more about robust (clustered) standard errors with fixed effects are calculated by fixest here and by xtreg here.

# Coef Map
cm = c("chair" = "Committee Chair",
       "ranking_minority" = "Ranking Member",
       "prestige" = "Prestige Committee",
       "first" = "First Year",
       "second" = "Second Year",
       "third" = "Third Year",
       "fourth" = "Fourth Year",
       "fifth" = "Fifth Year",
       "sixth" = "Sixth Year",
       "majority" = "Majority",
       "presidents_party" = "President's Party",
       "Legislator" = "Legislator", 
       "Agency" = "Agency",
       "FE: icpsr_agency" = "Legislator × Agency Fixed Effects",
       "icpsr_agency" = "Legislator × Agency Fixed Effects")

coef_omit = "(Intercept)|majority|presidents_party"


setFixest_dict(cm)

gof_omit = "R.*|AIC|BIC|Log.*|Std.*"

# table formatting to match stata (sort of)
format_table <- . %>% row_spec(row = 1, bold = T, hline_after = TRUE) %>% 
      kable_styling(font_size = 11) %>% 
                    #full_width = TRUE, 
                    #latex_options = c("repeat_header")) %>%
  str_replace("Num.Obs.", "Observations") %>% 
  str_replace("Std.Errors", "Robust/Clustered Std. Errors") %>% 
  str_replace("FE: Legislator_x_Agency", "Legislator x Agency FE") %>%
  str_replace("FE: Year_x_Agency", "Year x Agency FE") %>% 
  str_replace("FE: Year", "Year Fixed Effects") %>% 
  str_replace("FE: Legislator", "Legislator Fixed Effects") %>%
    str_replace_all("X|✓", "\\\\\\checkmark") %>% 
  #  extract just the table, no caption etc
  str_extract("\\\\begin\\{tabular\\}(\n|.)*tabular\\}") 

Total Letters

  • Figures: figs/m-total-[1:4].png
testing = F

# paper table 
# 1 
# cross-sectional 
m_total_cross <-feglm (perYear ~ 
                         chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority + presidents_party | Year_x_Agency,
                    cluster = "Legislator", 
           data = dcounts_tenure)

if(testing){modelsummary(m_total_cross, gof_omit = "R.*", coef_omit = coef_omit)}

coefplot(m_total_cross, horiz = T, drop = "(Intercept)") 



# 2
m_total_dnd <-feglm (perYear ~ 
                       chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority + presidents_party | Year_x_Agency + Legislator_x_Agency, 
                    cluster = "Legislator",
                    # ALT vcov = hetero ~ ssc(cluster.adj = TRUE),
           data = dcounts_tenure)

if(testing){modelsummary(m_total_dnd, gof_omit = "R.*", coef_omit = coef_omit)}

coefplot(m_total_dnd, horiz = T) 


# 3
m_total_2nd <-feglm (perYear ~ 
                       chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority + presidents_party | Year_x_Agency + Legislator_x_Agency, 
                    cluster = "Legislator", 
           data = dcounts_tenure %>% filter(survive == 1))

if(testing){modelsummary(m_total_2nd, gof_omit = "R.*", coef_omit = coef_omit)}
coefplot(m_total_2nd, horiz = T) 


# 4
m_logtotal_dnd <-feglm (log(perYear + 1) ~ 
                          chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority + presidents_party | Year_x_Agency + Legislator_x_Agency, 
                    cluster = "Legislator", 
           data = dcounts_tenure)

if(testing){modelsummary(m_logtotal_dnd, gof_omit = "R.*", coef_omit = coef_omit)}

coefplot(m_logtotal_dnd, horiz = T) 
Total Letters Per YearTotal Letters Per YearTotal Letters Per YearTotal Letters Per Year

Total Letters Per Year

Total Letters Table

  • Table: tables/models_total.tex (sans stars)
models_total <- list(
  "(1)" = m_total_cross,
  "(2)" = m_total_dnd,
  "(3)" =  m_total_2nd,
  "(4)" = m_logtotal_dnd
)

rows <- tibble(
  term = c("Dependent Variable", 
           "Majority",
           "Presidents` Party",
           "All Legislators", 
           "Served At Least 2nd Term"),
  `(1)` = c("Count", "✓", "✓", "✓", ""),
  `(2)` =c("Count", "✓", "✓", "✓", ""),
  `(3)` = c("Count", "✓","✓","", "✓"),
  `(4)` = c("Log(Count+1)","✓","✓", "✓", "") 
)

attr(rows, 'position') <- c(0, 20,21,22,23)


# HTML
modelsummary(models_total, stars = T, 
             add_rows = rows, 
             coef_map = cm,
             gof_omit = gof_omit,
             coef_omit = coef_omit,
             title = "The Effect of Expierence and Institutional Power on Legislator Contacts", 
             notes = list("Robust standard errors in parentheses, clustered by legislator."))
The Effect of Expierence and Institutional Power on Legislator Contacts
Dependent Variable Count Count Count Log(Count+1)
Committee Chair 0.715*** 0.271** 0.275** 0.049***
(0.151) (0.090) (0.090) (0.012)
Ranking Member 0.842*** 0.153 0.170+ 0.031**
(0.154) (0.094) (0.094) (0.010)
Prestige Committee 0.469*** 0.100+ 0.093+ 0.026**
(0.067) (0.051) (0.052) (0.010)
First Year −0.301*** −0.512*** −0.494*** −0.103***
(0.053) (0.075) (0.073) (0.012)
Second Year −0.067 −0.275*** −0.291*** −0.042***
(0.060) (0.072) (0.072) (0.011)
Third Year −0.046 −0.189** −0.208*** −0.030**
(0.063) (0.061) (0.060) (0.009)
Fourth Year 0.026 −0.135* −0.158** −0.018*
(0.067) (0.060) (0.057) (0.009)
Fifth Year −0.046 −0.135** −0.139*** −0.024***
(0.059) (0.043) (0.042) (0.007)
Sixth Year 0.049 −0.029 −0.011 −0.014*
(0.073) (0.056) (0.054) (0.007)
Majority
Presidents` Party
All Legislators
Served At Least 2nd Term
Num.Obs. 412111 412111 388997 412111
FE: Year_x_Agency X X X X
FE: Legislator_x_Agency X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
Robust standard errors in parentheses, clustered by legislator.
# TeX 
modelsummary(models_total, # stars = T, 
             add_rows = rows,               
             coef_map = cm, 
             gof_omit = gof_omit, 
             coef_omit = coef_omit,
             output = "latex",
             title = "\\\\footnotesize The Effect of Expierence and Institutional Power on Legislator Contacts", 
             notes = list("\\\\footnotesize Robust standard errors in parentheses, clustered by legislator.")) %>% 
  format_table() %>%
  write_lines(file = here::here("tables", "models_total.tex") )


beta <- m_total_dnd$coefficients %>%
  round(3) %>% 
  as_tibble(rownames = "beta") %>% 
  pivot_wider(names_from = beta)

se <- m_total_dnd$se %>%
  round(3) %>% as_tibble(rownames = "se") %>%
  pivot_wider(names_from = se)

Total Letters Narrative

To address potential confounding in across-legislator comparisons, the estimates from Model 2 (Column 2 of Table \ref{tab:models_total}) provides the estimated effects from the difference-in-differences specification in Equation \ref{e:diff1}. Across all measures of institutional power, we find that more power increases the number of requests that legislators make. Consider first the effect of being a committee chair. We estimate that becoming a committee chair causes an increase of 0.27 requests \textit{per agency} (95-percent confidence interval [0.09, 0.45]). Across all 90 agencies, this represents an increase of approximately 24 additional requests per year, 24.1\% of the average requests per year in our data. There is a smaller increase for individuals who become ranking members and those who join a Prestige Committee, though the increase is statistically significant for the prestige committee. Becoming a ranking member of a committee causes an increase of 0.15 contacts per agency, while joining a prestige committee causes a 0.27 per agency increase in the number of contacts a member of Congress makes.

We estimate that the experience gained between the first and second year in Congress causes an increase of 0.24 requests \textit{per agency}. The experience gained between the first and seventh year causes an increase of 0.51 per agency. Across all 90 agencies, this represents an increase of approximately 46 additional requests per year, 45.5\% of the average requests per year in our data. There is a smaller increase after the second year. The experience gained between the second and seventh year causes an increase of 0.28 per agency, an increase of approximately 25 additional requests per year, 45.5\% of the average requests per year in our data.

Total Letters Predictions

  • Figures: figs/m-total-predicted-[1:4].png
predicted <- predictions(m_total_cross,
                         newdata = values)

# Cross-sectional predictions
predicted %>%
    mutate(predicted = predicted*90,
         std.error = std.error*90) %>%
  ggchair() + 
  labs(title = "Predicted Total Letters per Year\n(Cross-Sectional)",
       x = "",
       y = "Predicted Total Letters Per Year",
       fill = "",
       color = "",
       shape = "") 

# by tenure
predicted <- predictions(m_total_cross,
                         newdata = values_tenure)

predicted %>%
    mutate(predicted = predicted*90,
         std.error = std.error*90) %>% 
ggtenure() +
  labs(title = "Predicted Total Letters Per Year\n(Cross-Sectional)",
       x = "Years Serving in Congress",
       y = "Predicted Letters Per Year",
       fill = "",
       color = "",
       shape = "") 


# diff in diff 
predicted <- predictions(m_total_dnd,
                         newdata = values)


# predictions by chair and presidents' party
predicted %>%
    mutate(predicted = predicted*90,
         std.error = std.error*90) %>%
  ggchair() + 
  labs(title = "Predicted Total Letters per Year\nDifference in Differences (Within-Legislator)",
       x = "",
       y = "Predicted Letters Per Year",
       fill = "",
       color = "",
       shape = "") 

# by tenure
predicted <- predictions(m_total_dnd,
                         newdata = values_tenure)

predicted %>%
    mutate(predicted = predicted*90,
         std.error = std.error*90) %>%
ggtenure() +
    geom_line(aes(x = as.numeric(year_in_congress %>% str_sub(1,1)))) + 
  labs(title = "Predicted Total Letters Per Year\nDifference in Differences (Within-Legislator)",
       x = "Years Serving in Congress",
       y = "Predicted Letters Per Year",
       fill = "",
       color = "",
       shape = "") 
TotalTotalTotalTotal

Total

Constituency Service

DV: Only letters coded as constituency service letters

  • Figures: figs/m-con-[1:4].png
testing = F

m_con_cross <-feglm (perYear_con ~ 
                       chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority + presidents_party | Year_x_Agency,
                    cluster = "Legislator", 
           data = dcounts_tenure)

if(testing){modelsummary(m_con_cross, gof_omit = "R.*", coef_omit = coef_omit)}

coefplot(m_con_cross, horiz = T, drop = "(Intercept)") 



# 2
m_con_dnd <-feglm (perYear_con ~ 
                     chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority + presidents_party | Year_x_Agency + Legislator_x_Agency, 
                    cluster = "Legislator",
           data = dcounts_tenure)

if(testing){modelsummary(m_con_dnd, gof_omit = "R.*", coef_omit = coef_omit)}
coefplot(m_con_dnd, horiz = T) 


# 3
m_con_2nd <-feglm (perYear_con ~ 
                     chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority + presidents_party | Year_x_Agency + Legislator_x_Agency, 
                    cluster = "Legislator", 
           data = dcounts_tenure %>% filter(survive == 1))

if(testing){modelsummary(m_con_2nd, gof_omit = "R.*", coef_omit = coef_omit)}
coefplot(m_con_2nd, horiz = T) 


# 4
m_logcon_dnd <-feglm (log(perYear_con + 1) ~ 
                        chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority + presidents_party | Year_x_Agency + Legislator_x_Agency, 
                    cluster = "Legislator", 
           data = dcounts_tenure)

if(testing){modelsummary(m_logcon_dnd, gof_omit = "R.*", coef_omit = coef_omit)}

coefplot(m_logcon_dnd, horiz = T) 
Constituency Service Letters Per YearConstituency Service Letters Per YearConstituency Service Letters Per YearConstituency Service Letters Per Year

Constituency Service Letters Per Year

Constituency Service Table

  • Table: tables/models_con.tex (sans stars)
models_con <- list(
  "(1)" = m_con_cross,
  "(2)" = m_con_dnd,
  "(3)" =  m_con_2nd,
  "(4)" = m_logcon_dnd
)


modelsummary(models_con, stars = T, 
             add_rows = rows, 
             coef_map = cm,
             gof_omit = gof_omit, 
             coef_omit = coef_omit)
Dependent Variable Count Count Count Log(Count+1)
Committee Chair 0.302** 0.040 0.044 0.012+
(0.108) (0.064) (0.064) (0.007)
Ranking Member 0.503*** 0.054 0.070 0.012+
(0.108) (0.067) (0.067) (0.007)
Prestige Committee 0.321*** 0.031 0.025 0.013+
(0.049) (0.036) (0.036) (0.007)
First Year −0.138*** −0.276*** −0.265*** −0.059***
(0.040) (0.055) (0.054) (0.008)
Second Year 0.009 −0.128* −0.142** −0.019*
(0.046) (0.053) (0.052) (0.008)
Third Year 0.030 −0.070 −0.088+ −0.011+
(0.047) (0.047) (0.046) (0.007)
Fourth Year 0.061 −0.055 −0.072 −0.006
(0.052) (0.046) (0.045) (0.006)
Fifth Year 0.001 −0.069* −0.064+ −0.011*
(0.044) (0.034) (0.033) (0.005)
Sixth Year 0.070 0.008 0.018 −0.004
(0.056) (0.044) (0.043) (0.005)
Majority
Presidents` Party
All Legislators
Served At Least 2nd Term
Num.Obs. 412111 412111 388997 412111
FE: Year_x_Agency X X X X
FE: Legislator_x_Agency X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
modelsummary(models_con, # stars = T, 
             add_rows = rows,               
             coef_map = cm, 
             gof_omit = gof_omit, 
             coef_omit = coef_omit,
             output = "latex",
             notes = list("\\\\footnotesize Robust standard errors in parentheses, clustered by legislator."))%>% 
  format_table() %>%
  write_lines(file = here::here("tables", "models_con.tex") )

beta <- m_con_dnd$coefficients %>%round(3) %>% as_tibble(rownames = "beta") %>% pivot_wider(names_from = beta)

se <- m_con_dnd$se %>%round(3) %>% as_tibble(rownames = "se") %>% pivot_wider(names_from = se)

Constituency Service Narrative

Table is identical to Table except that we subset the data to only legislator requests hand-coded as constituency service. Column 2 of Table \ref{tab:models_con} provides the estimated effects from the difference-in-differences specification in Equation \ref{e:diff1}. More experience increases the level of constituency service that legislators provide. The effect of being a committee chair is positive but not significant at the .05 level. We estimate that the experience gained between the first and second year in Congress causes an increase of 0.15 requests \textit{per agency}. The experience gained between the first and seventh year causes an increase of 0.28 per agency. Across all 90 agencies, this represents an increase of approximately 25 additional requests per year, 38.6\% of the average requests per year in our data. There is a smaller increase after the second year. The experience gained between the second and seventh year causes an increase of 0.13 per agency, an increase of approximately 12 additional requests per year, 38.6\% of the average requests per year in our data.

Constituency Service Predictions

  • Figures: figs/m-con-predicted-[1:4].png
# Cross-sectional predictions:
predicted <- predictions(m_con_cross,
                         newdata = values)


# A plot by chair & presidents' party
predicted %>%
  mutate(predicted = predicted*90,
         std.error = std.error*90) %>%
  ggchair() + 
  labs(title = "Predicted Constituency Service Letters per Year\n(Cross-Sectional)",
       x = "",
       y = "Predicted Letters Per Year",
       fill = "",
       color = "",
       shape = "") 

# by tenure
predicted <- predictions(m_con_cross,
                         newdata = values_tenure)

predicted %>%
    mutate(predicted = predicted*90,
         std.error = std.error*90) %>%
ggtenure() +
    geom_line(aes(x = as.numeric(year_in_congress %>% str_sub(1,1)))) + 
  labs(title = "Predicted Constituency Service Letters Per Year\n(Cross Sectional)",
       x = "Years Serving in Congress",
       y = "Predicted Letters Per Year",
       fill = "",
       color = "",
       shape = "") 



# Diff in diff predictions 
predicted <- predictions(m_con_dnd,
                         newdata = values)


# diff in diff plot
predicted %>%
  mutate(predicted = predicted*90,
         std.error = std.error*90) %>%
  ggchair() + 
  labs(title = "Predicted Constituency Service Letters per Year\nDifference in Differences (Within-Legislator)",
       x = "",
       y = "Predicted Letters Per Year",
       fill = "",
       color = "",
       shape = "") 

# by tenure
predicted <- predictions(m_con_dnd,
                         newdata = values_tenure)

predicted %>%
    mutate(predicted = predicted*90,
         std.error = std.error*90) %>%
ggtenure() +
    geom_line(aes(x = as.numeric(year_in_congress %>% str_sub(1,1)))) + 
  labs(title = "Predicted Constituency Service Letters Per Year\nDifference in Differences (Within-Legislator)",
       x = "Years Serving in Congress",
       y = "Predicted Letters Per Year",
       fill = "",
       color = "",
       shape = "") 
Constituency ServiceConstituency ServiceConstituency ServiceConstituency Service

Constituency Service

Policy Work

Only using letters coded as constituent letters

  • Figures: figs/m-policy-[1:4].png
testing = F

m_policy_cross <-feglm (perYear_policy ~ 
                          chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority +  presidents_party | Year_x_Agency,
                    cluster = "Legislator", 
           data = dcounts_tenure)

if(testing){modelsummary(m_policy_cross, gof_omit = "R.*", coef_omit = coef_omit)}

coefplot(m_policy_cross, horiz = T, drop = "(Intercept)") 



# 2
m_policy_dnd <-feglm (perYear_policy ~ 
                        chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority + presidents_party | Year_x_Agency + Legislator_x_Agency, 
                    cluster = "Legislator",
           data = dcounts_tenure)

if(testing){modelsummary(m_policy_dnd, gof_omit = "R.*", coef_omit = coef_omit)}
coefplot(m_policy_dnd, horiz = T) 


# 3
m_policy_2nd <-feglm (perYear_policy ~ 
                        chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority + presidents_party | Year_x_Agency + Legislator_x_Agency, 
                    cluster = "Legislator", 
           data = dcounts_tenure %>% filter(survive == 1))

if(testing){modelsummary(m_tenure_2nd, gof_omit = "R.*", coef_omit = coef_omit)}
coefplot(m_policy_2nd, horiz = T) 


# 4
m_logcon_dnd <-feglm (log(perYear_policy + 1) ~ 
                        chair + ranking_minority + prestige + 
                    first + second + third + fourth + fifth + sixth + 
                    majority + presidents_party | Year_x_Agency + Legislator_x_Agency, 
                    cluster = "Legislator", 
           data = dcounts_tenure)

if(testing){modelsummary(m_logcon_dnd, gof_omit = "R.*", coef_omit = coef_omit)}

coefplot(m_logcon_dnd, horiz = T) 
Policy Letters Per YearPolicy Letters Per YearPolicy Letters Per YearPolicy Letters Per Year

Policy Letters Per Year

Policy Work Table

  • Table: tables/models_policy.tex (sans stars)
models_policy <- list(
  "(1)" = m_policy_cross,
  "(2)" = m_policy_dnd,
  "(3)" =  m_policy_2nd,
  "(4)" = m_logcon_dnd
)


modelsummary(models_policy, stars = T, 
             add_rows = rows, 
             coef_map = cm,
             gof_omit = gof_omit, 
             coef_omit = coef_omit,
             notes = list("Robust standard errors in parentheses, clustered by legislator." ))
Dependent Variable Count Count Count Log(Count+1)
Committee Chair 0.199*** 0.158*** 0.159*** 0.036***
(0.027) (0.034) (0.034) (0.007)
Ranking Member 0.145*** 0.090*** 0.092*** 0.025***
(0.028) (0.024) (0.024) (0.005)
Prestige Committee 0.049*** 0.031** 0.031** 0.010**
(0.009) (0.010) (0.010) (0.003)
First Year −0.076*** −0.076*** −0.070*** −0.030***
(0.007) (0.016) (0.016) (0.004)
Second Year −0.045*** −0.042** −0.040* −0.018***
(0.007) (0.016) (0.016) (0.004)
Third Year −0.042*** −0.031* −0.033* −0.013***
(0.008) (0.013) (0.013) (0.004)
Fourth Year −0.021* −0.011 −0.013 −0.006+
(0.009) (0.013) (0.013) (0.004)
Fifth Year −0.022* −0.009 −0.011 −0.006+
(0.009) (0.011) (0.011) (0.003)
Sixth Year −0.011 0.002 0.003 −0.006*
(0.012) (0.012) (0.012) (0.003)
Majority
Presidents` Party
All Legislators
Served At Least 2nd Term
Num.Obs. 412111 412111 388997 412111
FE: Year_x_Agency X X X X
FE: Legislator_x_Agency X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
Robust standard errors in parentheses, clustered by legislator.
modelsummary(models_policy, # stars = T, 
             add_rows = rows,               
             coef_map = cm, 
             gof_omit = gof_omit, 
             coef_omit = coef_omit,
             output = "latex",
             notes = list("\\\\footnotesize Robust standard errors in parentheses, clustered by legislator." )) %>% 
  format_table() %>%
   write_lines(file = here::here("tables", "models_policy.tex") )

Policy Work Predictions

  • Figures: figs/m-policy-predicted-[1:4].png
predicted <- predictions(m_policy_cross,
                         newdata = values)

# Cross-sectional predictions
predicted %>%
  mutate(predicted = predicted*90,
         std.error = std.error*90) %>%
  ggchair() +
  labs(title = "Predicted Policy Letters per Year\n(Cross-Sectional)",
       x = "",
       y = "Predicted Letters Per Year",
       fill = "",
       color = "",
       shape = "") 

# by tenure
predicted <- predictions(m_policy_cross,
                         newdata = values_tenure)

predicted %>%
    mutate(predicted = predicted*90,
         std.error = std.error*90) %>%
ggtenure() +
    geom_line(aes(x = as.numeric(year_in_congress %>% str_sub(1,1)))) + 
  labs(title = "Predicted Policy Letters Per Year\n(Cross Sectional)",
       x = "Years Serving in Congress",
       y = "Predicted Letters Per Year",
       fill = "",
       color = "",
       shape = "") 


# Predictions for diff in diff plot 
predicted <- predictions(m_policy_dnd,
                         newdata = values)


# diff in diff plot
predicted %>%
  mutate(predicted = predicted*90,
         std.error = std.error*90) %>%
  ggchair() +
  labs(title = "Predicted Policy Letters per Year\nDifference in Differences (Within-Legislator)",
       x = "",
       y = "Predicted Letters Per Year",
       fill = "",
       color = "",
       shape = "")  

# by tenure
predicted <- predictions(m_policy_dnd,
                         newdata = values_tenure)

predicted %>%
    mutate(predicted = predicted*90,
         std.error = std.error*90) %>%
ggtenure() +
    geom_line(aes(x = as.numeric(year_in_congress %>% str_sub(1,1)))) + 
  labs(title = "Predicted Policy Letters Per Year\nDifference in Differences (Within-Legislator)",
       x = "Years Serving in Congress",
       y = "Predicted Letters Per Year",
       fill = "",
       color = "",
       shape = "") 

beta <- m_policy_dnd$coefficients %>%round(3) %>% as_tibble(rownames = "beta") %>% pivot_wider(names_from = beta)

se <- m_policy_dnd$se %>%round(3) %>% as_tibble(rownames = "se") %>% pivot_wider(names_from = se)
PolicyPolicyPolicyPolicy

Policy

Policy Work Narrative

Table \ref{tab:models_policy} is identical to Table \ref{tab:models_total} except that we subset the data to only legislator requests hand-coded as policy work. Column 2 of Tableprovides the estimated effects from the difference-in-differences specification in Equation. Across all measures of institutional power, we find that more power increases the level of policy work that legislators provide. Consider first the effect of being a committee chair. We estimate that becoming a committee chair causes an increase of 0.16 policy requests(95-percent confidence interval [0.09, 0.22]). Across all 90 agencies, this represents an increase of approximately 14 additional requests per year, 92.6%` of the average requests per year in our data. There is a smaller increase for individuals who become ranking members and those who join a Prestige Committee, though the increase is statistically significant for the prestige committee. Becoming a ranking member of a committee causes an increase of 0.09 contacts per agency while joining a prestige committee causes a 0.16 per agency increase in the policy requests a member of Congress makes.

Ratio

tibble::tibble(
  priority = seq(.2, .8, by = .2),
  capacity = c(100, 100, 100, 100),
  slope = c(-1)
) %>% 
  ggplot() +
  aes(x = capacity*priority,
      y = capacity*(1-priority) ,
      slope = slope, 
      intercept = capacity,
      label = str_c(capacity*priority, ", ", capacity*(1-priority))) + 
  geom_abline(slope = -1, intercept = c(100, 200), linetype = c(100,200)) + 
    #geom_hline(yintercept = .75, linetype = 2) + 
  #geom_vline(xintercept = .2, linetype = 2) + 
 stat_function(fun =  ~ 4*.x , geom = "line", color = "blue") +
   #stat_function(fun =  ~ 1*.x , geom = "line", linetype = 2, color = "blue") +
  #geom_label(vjust = 0) + 
  geom_point() +
  ylim(c(0,200)) + 
  xlim(c(0, 200)) + 
  labs(x = "Policy Work\n Capacity x Policy Share",
       y = "Constituency Service\n Capacity x (1-Policy Share)")
  • Figures: figs/m-ratio-[1:2].png
dcounts_ratio %<>% 
  mutate(Legislator = icpsr,
         Year = year) %>% 
  filter(year >2006 & year < 2019)

m_ratio_cross <- feglm(ratio ~
  chair + ranking_minority + prestige + majority +  presidents_party + 
  first + second + third + fourth + fifth + sixth | Year,
cluster = "Legislator",
data = dcounts_ratio)

if(testing){modelsummary(m_ratio_cross, gof_omit = "R.*", coef_omit = coef_omit)}

coefplot(m_ratio_cross, horiz = T, drop = "(Intercept)") 



# Diff in diff
m_ratio_dnd <- feglm(ratio ~
  chair + ranking_minority + prestige + majority + presidents_party + 
  first + second + third + fourth + fifth + sixth | 
    Legislator + Year,
cluster = "Legislator",
data = dcounts_ratio)

if(testing){modelsummary(m_ratio_dnd, gof_omit = "R.*", coef_omit = coef_omit)}

coefplot(m_ratio_dnd, horiz = T) 
RatioRatio

Ratio

Ratio Table

  • Table: tables/models_ratio.tex (sans stars)
models_ratio <- list(
  "(1)" = m_ratio_cross,
  "(2)" = m_ratio_dnd
)

rows <- tibble(
  term = c("Dependent Variable", "Majoirty", "President's Party"),
  `(1)` = c("Ratio", "✓", "✓"),
  `(2)` =c("Ratio", "✓", "✓")
)

attr(rows, 'position') <- c(0, 20,21)

modelsummary(models_ratio, stars = T, 
             add_rows = rows, 
             coef_map = cm,
             gof_omit = gof_omit, 
             coef_omit = coef_omit,
             notes = list("Robust standard errors in parentheses, clustered by legislator.") )
Dependent Variable Ratio Ratio
Committee Chair −0.070*** −0.071***
(0.016) (0.017)
Ranking Member −0.002 −0.029*
(0.013) (0.014)
Prestige Committee 0.022** −0.004
(0.008) (0.009)
First Year 0.057*** 0.017
(0.009) (0.014)
Second Year 0.064*** 0.024+
(0.008) (0.013)
Third Year 0.059*** 0.021+
(0.009) (0.012)
Fourth Year 0.035*** −0.003
(0.009) (0.012)
Fifth Year 0.027** −0.003
(0.010) (0.011)
Sixth Year 0.041*** 0.012
(0.009) (0.010)
Majoirty
President’s Party
Num.Obs. 6442 6442
FE: Year X X
FE: Legislator X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
Robust standard errors in parentheses, clustered by legislator.
modelsummary(models_ratio, # stars = T, 
             add_rows = rows,               
             coef_map = cm, 
             gof_omit = gof_omit, 
             coef_omit = coef_omit,
             output = "latex",
             notes = list("\\\\footnotesize Robust standard errors in parentheses, clustered by legislator.") ) %>% 
  # format to match stata output (sort of)
  format_table() %>%
   write_lines(file = here::here("tables", "models_ratio.tex") )

beta <- m_ratio_dnd$coefficients %>%round(3) %>% as_tibble(rownames = "beta") %>% pivot_wider(names_from = beta)

se <- m_ratio_dnd$se %>%round(3) %>% as_tibble(rownames = "se") %>% pivot_wider(names_from = se)

Ratio Narrative

Column 2 of Table \ref{tab:models_ratio} provides the estimated effects from the difference-in-differences specification. While there is little evidence that time in Congress affects legislator priorities, institutional positions do. We estimate that becoming a committee chair causes the ratio of constituency service to policy work to decrease by 0.07 (95-percent confidence interval [-0.04 , -0.1 ]). Becoming a ranking member of a committee causes a decrease of 0.03 in the ratio.

Predictions

  • Figures: figs/m-ratio-predicted-[1:4].png
predicted <- predictions(m_ratio_cross,
                         newdata = values)



# Cross-sectional predictions
predicted %>%
ggchair() +
  labs(title = "Predicted Ratio of Constituent to Policy Work\n(Cross-Sectional)",
       x = "",
       y = "Predicted Ratio of\nConstituent to Policy Work",
       fill = "",
       color = "",
       shape = "")

# by tenure
predicted <- predictions(m_ratio_cross,
                         newdata = values_tenure)

predicted %>%
ggtenure() +
  labs(title = "Predicted Ratio of Constituent to Policy Work\n(Cross-Sectional)",
       x = "Years Serving in Congress",
       y = "Predicted Ratio of\nConstituent to Policy Work",
       fill = "",
       color = "",
       shape = "")


# Predictions for diff in diff plot 
predicted <- predictions(m_ratio_dnd,
                         newdata = values)


# diff in diff plot
predicted %>%
  ggchair() + 
  labs(title = "Predicted Ratio of Constituent to Policy Work\nDifference in Differences (Within-Legislator)",
       x = "",
       y = "Predicted Ratio of\nConstituent to Policy Work",
       fill = "",
       color = "",
       shape = "")

# by tenure
predicted <- predictions(m_ratio_dnd,
                         newdata = values_tenure)

predicted %>%
ggtenure() +
    geom_line(aes(x = as.numeric(year_in_congress %>% str_sub(1,1)))) + 
  labs(title = "Predicted Ratio of Constituent to Policy Work\nDifference in Differences (Within-Legislator)",
       x = "Years Serving in Congress",
       y = "Predicted Ratio of\nConstituent to Policy Work",
       fill = "",
       color = "",
       shape = "")
RatioRatioRatioRatio

Ratio

Per District